\documentclass[a4paper,twocolumn]{article}
\usepackage{CJKutf8}
\usepackage{graphicx}
\usepackage{listings}
\usepackage[justification=centering]{caption}
\usepackage{subfigure}  
\usepackage{multirow}
\usepackage{balance}
\lstset{language=Matlab}
\lstset{breaklines}
\lstset{extendedchars=false}

\usepackage{amsmath,amsfonts,amsthm,amssymb}
\theoremstyle{definition}
\newtheorem{thm}{Theorem}
\newtheorem{exmp}{Example}
\newtheorem{defn}{Definition}
\newtheorem{lema}{Lemma}
\newtheorem{prop}{Proposition}
\newtheorem{coro}{Corollary}


\renewcommand{\baselinestretch}{1.25}

%------------setlength----------------%
\setlength{\textwidth}{162mm}
%\setlength{\textheight}{190mm}
\setlength{\textheight}{231mm}
\setlength{\headheight}{-0.1cm}
\setlength{\topmargin}{-0.1cm}
\setlength{\oddsidemargin}{-0cm}
\setlength{\evensidemargin}{-0cm}

\setlength\columnsep{12pt}
\setlength\columnseprule{0.4pt}

\setlength{\parskip}{1mm}
\setlength{\unitlength}{1mm}
\setlength{\parindent}{2em}

\title{Project: 用P1单元完成有限元设计}

\author{李之琪\quad3180103041}

\begin{document}
		\begin{CJK*}{UTF8}{gbsn}
\maketitle
\section{问题重述}
用P1有限元求解问题
$$
\begin{aligned}
-\Delta u&=2 \sin x \sin y,\\
\left.u\right|_{b}&=\sin x \sin y, x \in[1,2] \times[1,2] .
\end{aligned}
$$
不限制网格的样式。展示求解的结果，并计算问题的误差阶。
%\section{理论基础}
%1.问题的转化(化为离散形式)，离散与拼装
%2.积分的处理(局部与全局)
%3.边界预处理
\section{设计方案}
\subsection{项目文件说明}
\hspace*{2em}程序采用2011标准的C++编写，项目名称为\textbf{FEM\_2021}，项目文件结构如下：\\
\textbf{FEM\_2021}\\
\textbf{——Point.h}\\
\textbf{——Element.h}\\
\textbf{——Mesh.h}\\
\textbf{——Possion.h}\\
\textbf{——data}\\
\textbf{————D.d}\\
\textbf{————triangle.tmp\_geo}\\
\textbf{——Inputfile}\\
\textbf{————test}\\
\textbf{——Makefile}\\
\textbf{——main.cpp}\\
其中，\\
\hspace*{2em}\textbf{Point.h}:提供Point模板类，用Vector$<$T,\\DIM$>$的结构存储点，并给点赋予了全局编号和边界标识的属性，以便于后续使用。\\\\
\hspace*{2em}\textbf{Element.h}:包含一般性的单元结构Element和由其继承而来的求解本问题使用的TD\_P1Element类。用valarray储存了单元的局部信息和全局信息，以及相应代数精度下的积分信息。对于TD\_P1Element，其局部信息是确定的。此外还提供了各种局部与全局的关系函数以便后续使用。\\\\
\hspace*{2em}\textbf{Mesh.h}：提供EasyMesh类，用valarray存储用于计算的网格信息，具体而言包括全部点的信息和每个区间三个点的编号。可以从Easymesh产生的网格文件中读入以上数据。\\\\
\hspace*{2em}\textbf{Possion.h}：提供几个用于求解Possion问题和展示求解效果的函数。Possion\_Easymesh用于求解Possion问题；prior\_error计算求解结果的先验误差；plots\_matlab产生可供matlab运行的.m文件，用以展示求解效果。\\\\
\hspace*{2em}\textbf{data/D.d}：用指定的格式给出对网格的要求，可以供Easymesh产生指定网格。\\\\
\hspace*{2em}\textbf{data/triangle.tmp\_geo}：存储二维三角参考单元上的积分信息。\\\\
\hspace*{2em}\textbf{Inputfile/test}：按指定的输入文件格式提供网格精度、积分的代数精度、输出的误差类型等参数，供main函数使用。\\\\
\hspace*{2em}\textbf{Makefile}：能产生可执行文件main。还可以通过"make test"运行测试，产生下文展示的计算结果；通过"make report"得到此报告。\\\\
\hspace*{2em}\textbf{main.cpp}：将Inputfile中的输入文件作为第一个参数传入，在相应的网格上求解Possion问题，并输出对应的误差和可以展示求解效果的.m文件。
\subsection{设计思路}
下面用一个UML图展示设计思路。
\begin{figure}[!htp]   
	\centering
	\includegraphics[width=8cm]{Picture/Design.png}
\end{figure}
\newpage
\section{结果展示}
我们采用以下格式的输入文件：
\begin{table}[!htp]
	\centering
	\begin{tabular}{|c|c|c|c|}
		\hline	
		index & meshfile & accuracy & error\_type \\
		\hline		
		1 &D1& 1 & useless\_error\\
		\hline		
		2 &D2& 3 &prior\_error\\
		\hline		
	\end{tabular}
	\caption{输入文件格式}
\end{table}\\
以上输入文件中，meshfile表示提供的网格信息，不同网格的划分精度$h$不同；accuracy表示数值积分的代数精度；error\_type表示输出误差的类型，这里提供两种误差，分别是每个节点处简单作差累加的useless\_error和L2误差prior\_error。\\
下面给出计算结果的展示。输入文件信息如下：
\begin{table}[!htp]
	\centering
	\begin{tabular}{|c|c|c|c|}
		\hline	
		index & meshfile & accuracy & error\_type \\
		\hline		
		1 &D1& 3 & prior\_error\\
		\hline		
		2 &D2& 3 &prior\_error\\
		\hline
		3 &D3& 3 &prior\_error\\
		\hline			
	\end{tabular}
	\caption{测试输入}
\end{table}\\
其中，D1，D2与D3对应的网格划分精度$h$分别为0.4，0.2和0.1。可以使用"\textbf{make test}"来获得以下结果。\\\\
Problem 1: \\
The error of problem = 0.019772 \\
\begin{figure}[!htp]   
	\centering
	\includegraphics[width=9cm]{Picture/F1.eps}
	\caption{$h = 0.4$}
\end{figure}\\
\newpage
\noindent Problem 2: \\
The error of problem = 0.00425074 \\
\begin{figure}[!htp]   
	\centering
	\includegraphics[width=8cm]{Picture/F2.eps}
	\caption{$h = 0.2$}
\end{figure}\\
Problem 3: \\
The error of problem = 0.00112253\\
\begin{figure}[!htp]   
	\centering
	\includegraphics[width=8cm]{Picture/F3.eps}
	\caption{$h = 0.1$}
\end{figure}\\
进一步计算，不同网格划分精度$h$对应的L2误差如下表所示：
\begin{table}[!htp]
	\centering
	\begin{tabular}{|c|c|}
		\hline	
		h & L2 error  \\
		\hline		
		0.4 & 0.019772\\
		\hline		
		0.3 & 0.0101553\\
		\hline		
		0.2 & 0.00425074\\
		\hline
		0.1 & 0.00112253\\
		\hline
		0.075 & 0.000614168\\
		\hline			
	\end{tabular}
\end{table}\\
以$h^2$与$h$对应的误差为坐标点作图，结果如下：\\
\begin{figure}[!htp]   
	\centering
	\includegraphics[width=8cm]{Picture/F4.eps}
	\caption{}
\end{figure}\\
\newpage
\noindent 此结果说明问题的误差阶近似为2。
\section{总结}
在本项目中，我们设计并实现了用P1单元求解Dirichlet条件Possion方程。项目采用Easymesh产生网格剖分，使用Eigen库中的共轭梯度下降求解器来求解线性方程组，并用matlab展示计算结果。对不同网格划分精度下的L2误差的计算表明该问题的误差阶近似为2。
		\end{CJK*}
\end{document}